iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Python

在AWS上進行物聯網與人工智慧實作系列 第 25

D25-實驗:使用 GET 方法查詢資料 - Lambda

  • 分享至 

  • xImage
  •  

實驗:使用 GET 方法查詢資料 - Lambda

目錄

這個實驗是接續 實驗:建立 API Gateway-using mock ,將整合模擬(MOCK)改為 AWS Lambda,透過 Lambda 回傳伺服器的日期與時間。

啟動學習者實驗室

AWS Academy Learner Lab 是提供一個帳號讓學生可以自行使用 AWS 的服務,讓學生可以在 50 USD的金額下,自行練習所要使用的 AWS 服務,在此先介紹一下 Learner Lab 基本操作與限制。
AWS Academy 學習平台 的入口首頁 https://www.awsacademy.com/LMS_Login ,選擇以學生 (Students) 身分登錄,在課程選單中選擇 AWS Academy Learner Lab - Foundation Services 的課程,在課程選單中選擇 單元 (Module),接著單擊 啟動 AWS Academy Learner Lab,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20240901/20129510l7h4ELVM8V.png
圖 1. 啟動 AWS Academy Learner Lab

進入 Learner Lab 中,說明一下每個區塊,圖形在下方。

  1. 用來啓動 AWS 管理控制台介面,必須是出現綠點才可以點擊,而出現綠點必須要先啓動實驗 (Start Lab)
  2. 已用金額與全部實驗金額 (Used $0.2 of $50)。
  3. 工具列說明:
    • 『Start Lab』:開始實驗帳號,這時候就可以使用 AWS 資源。
    • 『End Lab』:就會停止計費,並把所有的 AWS 資源關閉,注意,這只是暫停這些資源,並不會回收。
    • 『AWS Details』:使用者(IAM 用戶)相關的密鑰資料可以從來取得。
    • 『Readme』:說明手冊,就是下方的 5.
    • 『Reset』:就會把目前所有的 AWS 設定好的資源都清除掉。
  4. 切換說明的語系,ZH-CN 是簡體中文。
  5. 說明手冊。

https://ithelp.ithome.com.tw/upload/images/20240901/201295105N2lVJhhb4.png
圖 2. Learner Lab 畫面說明

撰寫 AWS Lambda

建立函數

進入 Lambda 控制台,建立一個新的 AWS Lambda 函數,配置如下:

  • 函數名稱:get_datetime_func (可以自定)
  • 執行時間: Python 3.12
  • 執行角色:使用現有角色, LabRole (這個角色可以使用大多數 Learner Lab 中的資源)

https://ithelp.ithome.com.tw/upload/images/20240901/20129510NV6QSPk8vG.png
圖 3. 建立 AWS Lambda 函數

編碼

在 Lambda 函數中撰寫要運行的程式碼,在程式碼頁簽程式碼來源撰寫測試的程式。
取得時間的方式可以用世界協調時間(Coordinated Universal Time,簡稱UTC)是最主要的世界時間標準,它為當前時間建立了參考,形成了民用時間和時區的基礎。因為伺服器時間會因為所在區域不同而不一樣,所以需要根據台北時間(+8)來進行調整。
而回傳的回應需要加上標頭資訊:

  • Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
  • Access-Control-Allow-Methods: 'GET'
  • Access-Control-Allow-Origin: '*'
import json
from datetime import datetime, timedelta

def lambda_handler(event, context):
    datetime_format = "%Y-%m-%dT%H-%M-%S"
    taipei_time = datetime.utcnow() + timedelta(hours=8)
    timestamp_str = taipei_time.strftime(datetime_format)
    resp_date = {
        'date': timestamp_str.split('T')[0],
        'time': timestamp_str.split('T')[-1]
    }
    return {
        'statusCode': 200,
        "headers": {
            "Access-Control-Allow-Headers": 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
            "Access-Control-Allow-Methods": 'GET',
            "Access-Control-Allow-Origin": '*'
        },
        'body': json.dumps(resp_date)
    }

部署

編寫完成程式碼之後,由於還沒有部署,無法進行測試或者調用。部署類似於將程式碼同步到 Lambda 函數中,部署程式碼,點擊 Deploy,撰寫完程式碼之後需要部署程式碼,之後才能進行測試。

測試 / 調用

編寫完成程式碼並且部署成功之後,可以進行測試 / 調用 Lambda 函數,得到結果。

  1. 編輯測試事件
  • 點擊Test

  • 設定測試事件

    • 測試事件動作 - 建立新事件
    • 事件名稱 - testEvent
    • 事件共享設定 - 私有
    • 範本 - API Gateway Http API
    • 事件 JSON - 會自動生成

https://ithelp.ithome.com.tw/upload/images/20240901/20129510hdeiHf3GV9.png
圖 4. 設定測試事件

  • 點擊儲存,完成設定
  1. 測試程式碼
    編輯好測試事件之後就能測試撰寫的程式碼了。
  • 點擊Test,測試程式碼
  • 查看測試結果
    切換到 Execution results,查看結果
    https://ithelp.ithome.com.tw/upload/images/20240901/20129510k5G5hCDt14.png
    圖 5. 測試結果

更新 API 端點 GET

打開 API Gateway 控制台,選擇 dateAPI (實驗:建立 API Gateway-using mock 所建立的 REST API),選擇 DateInfo 資源中的 GET 方法,編輯整合需求。

https://ithelp.ithome.com.tw/upload/images/20240901/20129510IX3qAr2qS7.png
圖 6. 編輯 GET 方法的整合需求

  • 將原來的整合類型模擬更改為 Lambda 函數
  • 打開 Lambda 代理整合
  • 選擇先前設計的 Lambda 函數:get_datetime_func
  • 執行角色:LabRole(可以到IAM視窗中找到這個arn,如下圖)

https://ithelp.ithome.com.tw/upload/images/20240901/20129510vNv3JsD8Zv.png
圖 7. 在 IAM 控制台找到 LabRole 的 ARN

https://ithelp.ithome.com.tw/upload/images/20240901/201295100M5lDlw98g.png
圖 8. 更新 GET 方法的整合需求

測試

最後選擇測試觀看結果,如果正確會回應狀態200,以及指定的回應內文與回應標頭。

https://ithelp.ithome.com.tw/upload/images/20240901/2012951006EJUhL4KW.png
圖 9. 對於設定好的方法進行測試

部署 API

在左側的資源選單中,可以找到資源畫面的右上方有 部署 API 按鈕,點擊後選擇階段名稱為 dev 後,進行部署。

完成部署後,選擇階段選單,找到叫用URL,並複製起來。

https://ithelp.ithome.com.tw/upload/images/20240901/20129510IiKEhuw10t.png
圖 10. 複製所需的 API 端點

叫用URL貼在空白瀏覽器上,在瀏覽器上上測試 API 資源,如果出現日期資料,即表示 API Gateway 部署成功。

https://ithelp.ithome.com.tw/upload/images/20240901/20129510MrQXbdzHuP.png
圖 11. 在瀏覽器上上測試 API 資源

確認網站是否使用 AWS Lambda

進入 S3 控制台,找到 index.html 所在的網址,通常是

https://[bucketname].s3.amazonaws.com/[object]

https://ithelp.ithome.com.tw/upload/images/20240901/20129510MH8OsIiEpV.png
圖 12. 檢視 index.html 網址

打開 index.html 網址並點擊 Load Information,可以看到下方會出現 ajax 呼叫 API Gateaway,來取得資料,並顯示在畫面上。可以重複點擊 Load Information,可以發現時間會持續更新,這表示是使用 AWS Lambda 函數,而不是使用模擬方法。

https://ithelp.ithome.com.tw/upload/images/20240901/20129510RjcESc6tWd.png
圖 13. 檢視網頁運作

參考資料


上一篇
D24-AWS Lambda
下一篇
D26-實驗:使用 POST 方法上傳圖片 - Lambda
系列文
在AWS上進行物聯網與人工智慧實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言